package com.linksoul.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 证书编号生成工具类
 */
public class CertificateNoGenerator {

    // 原子计数器 (确保多线程安全)
    private static final AtomicLong COUNTER = new AtomicLong(0);
    // 机器ID (分布式环境下可配置)
    private static final String MACHINE_ID = "01";
    // 随机数范围
    private static final int RANDOM_BOUND = 9999;

    /**
     * 生成唯一证书编号 (默认格式: 年月日 + 机器ID + 4位随机数 + 4位自增序列)
     * 示例: CERT202405200101234567
     */
    public static String generate() {
        return generate("CERT", "yyyyMMdd", 4, 4);
    }

    /**
     * 自定义格式生成证书编号
     * @param prefix      前缀 (如: CERT/EDU)
     * @param datePattern 日期格式 (如: yyyyMMddHHmmss)
     * @param randomLen   随机数位数 (0表示不启用)
     * @param sequenceLen 自增序列位数 (0表示不启用)
     */
    public static String generate(String prefix, String datePattern, int randomLen, int sequenceLen) {
        StringBuilder builder = new StringBuilder();

        // 1. 前缀
        if (prefix != null) {
            builder.append(prefix);
        }

        // 2. 时间部分
        if (datePattern != null) {
            builder.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern(datePattern)));
        }

        // 3. 机器标识
        builder.append(MACHINE_ID);

        // 4. 随机数部分
        if (randomLen > 0) {
            builder.append(String.format("%0" + randomLen + "d",
                    ThreadLocalRandom.current().nextInt(RANDOM_BOUND)));
        }

        // 5. 自增序列
        if (sequenceLen > 0) {
            long seq = COUNTER.incrementAndGet() % (long) Math.pow(10, sequenceLen);
            builder.append(String.format("%0" + sequenceLen + "d", seq));
        }

        return builder.toString();
    }


}